package org.exes;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServidorSocket {

    static class HiloAtencion implements Runnable {

        private Socket socCliente;

        private HiloAtencion(Socket socCliente) {
            this.socCliente = socCliente;
        }

        public void run() {
            try {
                procesarCliente(socCliente);
            } catch (IOException ex) {
                Logger.getLogger(ServidorSocket.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        private static void procesarCliente(Socket socCliente) throws IOException {
            InputStream is = socCliente.getInputStream();
            OutputStream os = socCliente.getOutputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String peticion = br.readLine();
            System.out.println(peticion);

            String encabezado;
            while (!(encabezado = br.readLine()).equals("")) {
                System.out.println(encabezado);
            }

            String[] fragmentos = peticion.split(" ");
            String nombreFichero = fragmentos[1];

            nombreFichero = URLDecoder.decode(nombreFichero, "UTF-8");

            File fichero = new File("c:\\", nombreFichero);




            if (!fichero.exists()) {
                String respuesta = "<h1>" + fichero.getAbsolutePath() + "</h1>";
                os.write(respuesta.getBytes("ASCII"));
                os.flush();
                respuesta = "<h1>no existe!!</h1>";
                os.write(respuesta.getBytes("ASCII"));
                os.flush();
            } else {
                if (fichero.isFile()) {
                    FileInputStream fis = new FileInputStream(fichero);
                    //fichero.length();
                    NIO.copiarFlujoAFlujo(fis.available(), fis, os);
                } else {
                    File[] hijos = fichero.listFiles();
                    StringBuilder sb = new StringBuilder();
                    for (File hijo : hijos) {
                        //respuesta = "<h1>" + hijo.getName() + "</h1>";
                        sb.append("<h1>").append(hijo.getName()).append("</h1><br/>");
                    }
                    String respuesta = sb.toString();
                    os.write(respuesta.getBytes("ASCII"));
                    os.flush();
                }
            }

            os.close();
        }
    }

    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(1050);
        while (true) {
            Socket socCliente = ss.accept();

            Thread t = new Thread(new HiloAtencion(socCliente));
            t.start();

        }
    }
}
